package com.play2gether;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import static com.play2gether.Conexiones.verificaConexion;

/**
 * Created by Raul on 22/05/14.
 */
public class menuActivity extends ActionBarActivity implements View.OnClickListener{

    private String            id;
    private String[]          estado;
    private String            url;
    private DataBaseManager   db;
    private Sincronizar       sinc;

    private TextView txtPerfil;
    private TextView textInfor;
    private TextView textVinculacion;
    private TextView textSesion;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menu_opciones);

        url = "http://mediadomeprojects.com/arkdyanbyte/play2gether/public/pooling";
        Bundle bundle = getIntent().getExtras();

        id     = bundle.getString("id");
        estado = bundle.getStringArray("estado");

        db = new DataBaseManager(this);

        configurarVista();
        configurarNavbar();
    }

    private void configurarVista(){
        txtPerfil       = (TextView) findViewById(R.id.textPerfil);
        textInfor       = (TextView) findViewById(R.id.txtInfor);
        textVinculacion = (TextView) findViewById(R.id.textVinculacion);
        textSesion      = (TextView) findViewById(R.id.textSesion);

        textVinculacion.setText(estado[1]);

        txtPerfil.setOnClickListener(this);
        textInfor.setOnClickListener(this);
        textVinculacion.setOnClickListener(this);
        textSesion.setOnClickListener(this);
    }
    private void configurarNavbar(){
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setCustomView(R.layout.navbar);

        Button btFormularioNV = (Button) findViewById(R.id.btFormularioNV);
        Button btSugerenciaNV = (Button) findViewById(R.id.btSugerenciaNV);
        Button btOpcionesNV   = (Button) findViewById(R.id.btOpcionesNV);
        Button btLogoNV       = (Button) findViewById(R.id.btLogoNV);
        Button btAtras        = (Button) findViewById(R.id.bt_atras);
        Button btSincronizar  = (Button) findViewById(R.id.bt_sincronizar);

        TextView tituloNav = (TextView) findViewById(R.id.tituloLayout);
        tituloNav.setText("Opciones");

        //Botones para el navbar
        btOpcionesNV.setOnClickListener(this);
        if (!estado[0].equals("2")) {
            btFormularioNV.setAlpha(0);
            btSugerenciaNV.setAlpha(0);
            btSincronizar.setAlpha(0);
        } else {
            btFormularioNV.setOnClickListener(this);
            btSugerenciaNV.setOnClickListener(this);
        }
            btLogoNV.setOnClickListener(this);
            btAtras.setOnClickListener(this);
            btSincronizar.setOnClickListener(this);
            //btAtras.setAlpha(0);
            //btSincronizar.setAlpha(0);
            //btOpcionesNV.setAlpha(0);

        sinc = new Sincronizar(id,this);
    }

    @Override
    public void onClick(View v) {
        Intent intent;
        intent = new Intent();

        switch (v.getId()) {
            case R.id.btFormularioNV:
                intent.setClass(this,indexFormularios.class);
                intent.putExtra("id",id);
                intent.putExtra("estado",estado);
                startActivity(intent);
                finish();
                break;
            case R.id.btSugerenciaNV:
                intent.setClass(this,indexSugerencias.class);
                intent.putExtra("id",id);
                intent.putExtra("estado",estado);
                startActivity(intent);
                finish();
                break;
            case R.id.btOpcionesNV:
                intent.setClass(this,menuActivity.class);
                intent.putExtra("id",id);
                intent.putExtra("estado",estado);
                startActivity(intent);
                finish();
                break;
            case R.id.bt_atras:
                finish();
                break;
            case R.id.btLogoNV:
                finish();
                break;
            case R.id.bt_sincronizar:
                sinc.sincronizar();
                break;
            case R.id.textPerfil:
                 intent = intent.setClass(this,PerfilActivity.class);
                 intent.putExtra("id",id);
                 intent.putExtra("estado",estado);
                 startActivity(intent);
                 break;
            case R.id.txtInfor:
                 intent = intent.setClass(this,sobrePlay2getherActivity.class);
                 intent.putExtra("id",id);
                 intent.putExtra("estado",estado);
                 startActivity(intent);
                 break;
            case R.id.textVinculacion:
                 comprobarPeticionVinculacion();
                 break;
            case R.id.textSesion:
                 mostrarCierreSesion();
                 break;
        }
    }
    public void guardarSesion(String n){
        SharedPreferences preferencias = getSharedPreferences("sesion", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferencias.edit();
        editor.putString("activa", n);
        editor.putString("id","");
        editor.commit();

        Intent intent = new Intent(menuActivity.this,principalActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }
    private void comprobarPeticionVinculacion(){
        if(verificaConexion(this)){
            try {
                new consultarVinculacion().execute();
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("ERROR", e.getMessage());
            }
        }else {
            mostrarAlerta("No hay conexión", "Prueba de nuevo cuando estés conectado a la red!!");
        }
    }
    public class consultarVinculacion extends AsyncTask<Void, Void, JSONObject> {
        //TextView, es el primer dato que se le pasa a doInBackground.
        //El segundo que está en void es el dato que se va actualizar cada vez que se llame al metodo onProgressUpdate(No sobreescrito) para mostrar un mensaje de se está cargando o mostrar una barra de carta
        //El tercero es lo que nos va a devolver. En este caso un String.

        protected void onPreExecute(){ //Aquí se ponen lo que quiero que haga mientras se cargan los datos. Se ejecuta antes de el doInBackground
            Toast.makeText(getApplicationContext(), "Conectando con el servidor", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected  JSONObject doInBackground(Void... JSONObject) { // Segunda función. Nos devuelve el parámetro que viene del post se modificará todo lo gráfico que se hace en primer plano.
            HttpClient cliente = new DefaultHttpClient();
            HttpPost htppost = new HttpPost(url);
            //BufferedReader bfr;
            String text = "Error";
            String result="";
            InputStream is = null;
            JSONObject json = null;

            //Añadir parametros
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("asunto","envios_pendientes"));
            params.add(new BasicNameValuePair("id1",id));

            try {
                htppost.setEntity(new UrlEncodedFormEntity(params));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            try {
                HttpResponse respuesta = cliente.execute(htppost);
                HttpEntity entity = respuesta.getEntity();
                is = entity.getContent();
                //text = EntityUtils.toString(entity);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
            } catch(Exception e){}

            try{
                json = new JSONObject(result);
            }catch(JSONException e){}

            //return json;
            return json;
        }
        protected void onPostExecute(JSONObject json) {
            String tipo_envio = "0";
            String asunto = "";
            String estadoResp = "ok";
            String email = "";
            String apodo = "";

            try {
                int i=0;
                String pos;
                if (json!=null) {
                    JSONObject datos = (JSONObject) json.get("vinculacion");

                    while (i < datos.length()) {
                        pos = "e" + i;
                        JSONObject objeto = (JSONObject) datos.get(pos);
                        tipo_envio = (String) objeto.get("tipo_envio");
                        estadoResp = (String) objeto.get("estado");
                        email = (String) objeto.get("email");
                        apodo = (String) objeto.get("apodo");
                        i++;
                    }
                    if (estadoResp.equals("ko")) {
                        Toast.makeText(getApplicationContext(), "Se ha producido un error. Prueba de nuevo!!", Toast.LENGTH_SHORT).show();

                    }
                    else if (estadoResp.equals("ok")) {
                        if (tipo_envio.equals("1")) {
                            apodo = db.consultarApodo(id);
                            db.modificarApodo(apodo, id);
                            db.cambiarEstadoUsuario(id, 2);
                            eliminarEnvio();
                            mostrarAlerta2("Vinculacion aceptada", " Felicidades, tu " + apodo + " ha aceptado tu solicitud de vinculación!!");
                        } else if (tipo_envio.equals("2")) {
                            Intent intent = new Intent(menuActivity.this, PeticionVinculacionActivity.class);
                            intent.putExtra("email", email);
                            intent.putExtra("id", id);
                            intent.putExtra("estado", estado);
                            startActivity(intent);
                        } else if (tipo_envio.equals("0")) { redirigirSegunEstado();
                            //Crear dos más: petición cancelada y vinculación cancelada
                        } else if (tipo_envio.equals("3")) {
                            db.modificarApodo("", id);
                            db.cambiarEstadoUsuario(id, 0);
                            mostrarAlerta("Petición cancelada", " Lamentamos comunicarte que tu " + apodo + " ha cancelado tu petición de vinculación!!");
                            db.grabarEmailPareja(id, "");
                        } else if (tipo_envio.equals("4")) {
                            db.modificarApodo("", id);
                            db.cambiarEstadoUsuario(id, 0);
                            mostrarAlerta("Vinculación cancelada", " Lamentamos comunicarte que tu " + apodo + " se ha desvinculado de tí. Se borrarán todo vuestro historial conjunto de Play2gether!!");
                            db.grabarEmailPareja(id, "");
                        }
                    }
                }
                else{ redirigirSegunEstado(); } //Si no hay envios, se carga la pantalla correspondiente
            } catch (JSONException e) {
                Toast.makeText(getApplicationContext(), "Se ha producido un error. Prueba de nuevo!!", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
    }
    public void redirigirSegunEstado(){
        if (estado[0].equals("0")) {
            Intent intent = new Intent(menuActivity.this, VincularActivity.class);
            intent.putExtra("id",id);
            intent.putExtra("estado",estado);
            startActivity(intent);
        }
        else {
            Intent intent = new Intent(menuActivity.this, consultarVinculacionActivity.class);
            if (estado[0].equals("1")){ intent.putExtra("tipo","1"); }
            else                      { intent.putExtra("tipo","2"); }

            intent.putExtra("id",id);
            intent.putExtra("estado",estado);
            startActivity(intent);
        }
    }
    public void mostrarAlerta(String titulo, String texto){
        AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(this);
        alertDialog2.setTitle(titulo);
        alertDialog2.setMessage(texto);

        alertDialog2.setPositiveButton("ACEPTAR",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {}
        });
        alertDialog2.show();

    }
    public void mostrarAlerta2(String titulo, String texto){
        AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(this);
        alertDialog2.setTitle(titulo);
        alertDialog2.setMessage(texto);

        alertDialog2.setPositiveButton("ACEPTAR",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                reload();
        }
        });

        alertDialog2.show();

    }
    public void reload(){
        Intent intent = new Intent(this,principalActivity.class);
        intent.putExtra("id",id);
        intent.putExtra("estado",estado);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    }

    public void mostrarCierreSesion(){
        AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(this);
        alertDialog2.setTitle("¿Estas seguro que quieres cerrar la sesión?");

        alertDialog2.setPositiveButton("ACEPTAR",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                guardarSesion("0");
                Intent intent = new Intent(menuActivity.this,principalActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });
        alertDialog2.setNegativeButton("CANCELAR", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            }
        });


        alertDialog2.show();

    }
    public void eliminarEnvio(){
        if(verificaConexion(this)){
            try {
                new eliminarEnvioFelicidades().execute();
            } catch (Exception e) {
                e.printStackTrace();
                Log.e("ERROR", e.getMessage());
            }
        }else {
            mostrarAlerta("Ha habido un error", "por conexión de red!!!");
        }
    }

    public class eliminarEnvioFelicidades extends AsyncTask<Void, Void, Void> {
        protected void onPreExecute(){}

        @Override
        protected  Void doInBackground(Void... Void) {

            url = "http://mediadomeprojects.com/arkdyanbyte/play2gether/public/eliminar_envios";

            HttpClient cliente = new DefaultHttpClient();
            HttpPost htppost = new HttpPost(url);
            //BufferedReader bfr;
            String text = "Error";
            String result="";
            InputStream is = null;
            JSONObject json = null;

            //Añadir parametros
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("tipo_envio","2"));
            params.add(new BasicNameValuePair("id_usuario",id));

            try {
                htppost.setEntity(new UrlEncodedFormEntity(params));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            try {
                HttpResponse respuesta = cliente.execute(htppost);
                HttpEntity entity = respuesta.getEntity();
                is = entity.getContent();
                //text = EntityUtils.toString(entity);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        protected void onPostExecute() {}
    }
    public void sincronizar(){
        Sincronizar sinc = new Sincronizar(id,this);
        sinc.sincronizar();

    };
}
